package main

import "fmt"

func main() {
	//关于指针，go语言提供两种对指针的操作：&  *
	n := 18               //int类型数字
	p := &n               //&取n的地址   p的类型为*int  即：存储int类型的指针变量
	fmt.Printf("%T\n", p) //*int
	fmt.Println(p)        //0xc0000160a8

	n = 88
	m := *p                      // *  根据地址取值  取到的类型即地址所存值本身的类型
	fmt.Printf("%d, %T\n", m, m) //88, int

	var a1 *int     //声明一个指向int类型的指针变量  其初始为空指针nil
	fmt.Println(a1) //<nil>   实际上很少这样声明  只是声明了一个指针变量a但是没有初始化
	//指针作为引用类型需要初始化后才会拥有内存空间

	//使用new进行指针变量的初始化
	a := new(int)   //为a分配一块 存储int类型变量的 地址空间
	fmt.Println(a)  //0xc0000160d8   这个空间的值为类型初始0值
	fmt.Println(*a) //0

	//同样是内存分配，new 和 make有什么区别：
	//1.make只用于slice、map以及channel的初始化，返回的还是这三个引用类型本身；
	//2.而new用于类型的内存分配，并且内存对应的值为类型零值，返回的是指向类型的指针。
}
